package com.my.db.test.mybatis.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * https://blog.csdn.net/sihai12345/article/details/81070174
 * 枚举的用法
 * @author timo 2021/3/25
 */
//@Data只能写在class中，无法写在enum上，写上@Getter就行。
@Getter
@AllArgsConstructor
public enum DemoLevelEmum
//        implements BaseEnum
{
//    qt(1,"青铜"){
//        @Override
//        public void action() {
//            //定向操作
//        }
//    },
//qt.action()
    qt(1,"青铜"),
    by(2,"白银"),
    hj(3,"黄金"),
    zs(4,"钻石"),
    ds(5,"大师"),
    wz(6,"王者");
    //标记数据库存的值是value
    @EnumValue
    private final Integer id;
    @JsonValue
    private final String name;

    //    public abstract void action();
//    @Override
//    public Integer getId() {
//        return this.id;
//    }
//    @Override
//    public String getVal() {
//        return this.name;
//    }

////    使用@RequestBody会不走此拦截,springboot默认通过下标查找,
////     * 比如客户端传level = 1过来,springboot会自动找到下标等于1的枚举值（也就是白银段位）,
////     * 这不是我们想要的结果.我们定义的level = 1是青铜段位.
////  1、  @JsonDeserialize(using = JacksonEnumDeserializer.class) 此方式处理
////  2、 @JsonCreator
//    @JsonCreator
//    //当json在反序列化时，默认选择类的无参构造函数创建类对象，当没有无参构造函数时会报错，@JsonCreator作用就是指定反序列化时用的无参构造函数
////    加这个注解报错 - 不清楚原因 - findStr 名字可以自定义，随便是什么都行 参数值s 也是什么都行
////    @JsonProperty("level")
//    static DemoLevelEmum findStr(Integer s){
//        for (DemoLevelEmum item : DemoLevelEmum.values()) {
//            if (item.getId().equals(s)) {
//                return item;
//            }
//        }
//        return null;
//    }

//    已经封装起来了 参考 CustomEnums 性别
//    public static void main(String[] args) {
//        // 通过静态方式直接获取枚举实例对象，打印实例对象自动调用toString()方法
//        System.out.println(DemoLevelEmum.qt);
//
//        // 获取实例对象之后，获取相关属性信息
//        System.out.println(DemoLevelEmum.qt.getId());
//        System.out.println(DemoLevelEmum.qt.getName());
//
//        // 通过valueOf()方法获取枚举实例对象，并获取对象相关信息
//        System.out.println(DemoLevelEmum.valueOf("qt").getName());
//        System.out.println(DemoLevelEmum.valueOf(DemoLevelEmum.class, "qt").getName());
//
//        // 通过自定义的静态方法colorOf(int code)获取color信息
//        // YELLO(4,"黄色")
//        System.out.println(DemoLevelEmum.valueOf(4));
//
//        System.out.println(getEnumTypeByIndex(3));
//    }
//    /**
//     * 根据索引获取对应的枚举对象
//     * @param index
//     * @return
//     */
//    public static DemoLevelEmum getEnumTypeByIndex(int index) {
//        DemoLevelEmum[] values = DemoLevelEmum.values();
//        for (DemoLevelEmum value : values) {
//            if (value.getId() == index) {
//                return value;
//            }
//        }
//        return null;
//    }
//    // 提供静态方法，通过code获取color的值
//    public static String valueOf(int id) {
//        // EnumColor.values()获取枚举所有实例对象，还有通过名称获取方式EnumColor.valueOf("RED")、EnumColor.valueOf(EnumColor.class,
//        // "RED")
//        // 遍历枚举所有实例对象
//        for (DemoLevelEmum color : DemoLevelEmum.values()) {
//            if (color.getId() == id) {
//                return color.getName();
//            }
//        }
//        return null;
//    }
}

